package com.evl.wxpay.util.paytype;

import java.util.Date;
import java.util.Map;

import com.evl.wxpay.util.IWXPay;
import com.evl.wxpay.util.paytype.verify.OrderVerify;
import com.evl.wxpay.util.paytype.verify.QueryVerify;
import com.evl.wxpay.util.paytype.verify.RefundVerify;
import com.evl.wxpay.util.paytype.verify.Verify;

/**
 * 微信支付接口请求类型
 * @author dangsheng
 *
 */
public enum PayType {
	/**
	 * 下单支付
	 */
	ORDER(1,"下单支付",new OrderVerify()),
	/**
	 * 退票支付
	 */
	REFUND(2,"退款",new RefundVerify()),
	/**
	 * 支付订单查询
	 */
	QUERY(3,"订单支付信息查询",new QueryVerify());
	
	private Integer value;	//类型值
	private String desc;	//类型描述
	private Verify verify;	//数据处理校验器
	private Object obj;		//输入的对象，根据不同类型自行转换，自行处理
	private Map reqData;	//发送请求的所有参数对象
	private Map rspData;	//请求返回的参数对象
	private String reqXml;	//发送请求的xml，加密后的
	private String rspXml;	//请求响应的xml
	private String url;		//发送请求的url
	private String payStatus;	//更新支付日志时的支付状态
	private String error;	//错误，异常信息
	private Date reqTime;	//发送请求的时间
	private Date rspTime;	//请求响应的时间
	private boolean sucessed;	//请求响应支付结果成功的状态
	private String openId; 	//微信openid
	private String formId; 	//微信formId
	
	public String getFormId() {
		return formId;
	}

	/**
	 * 设置消息推送formId，不设置则不发送消息通知
	 * @param formId
	 * @return
	 */
	public PayType setFormId(String formId) {
		this.formId = formId;
		return this;
	}

	/**
	 * 初始化PayType
	 * @param value
	 * @param desc
	 * @param verify
	 */
	PayType(Integer value,String desc,Verify verify){
		this.value = value;
		this.desc = desc;
		this.verify = verify;
	}
	
	/**
	 * 添加请求数据对象，后续对该对象的操作自行转换
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public PayType initData(Object obj) throws Exception{
		this.obj = obj;
		//校验数据
		this.reqData = verify.required(obj);
		return this;
	}
	
	/**
	 * 发送request请求
	 * @param wXPay
	 * @return
	 * @throws Exception
	 */
	public PayType request(IWXPay wXPay) throws Exception{
		//发送支付请求
		verify.request(wXPay,this);
		//判断支付是否成功
		verify.checkStatus(this);
		//支付完成调用方法
		verify.complete(this);
		//推送消息
		verify.sendMessage(this);
		return this;
	}

	/**
	 * 添加支付接口日志记录
	 * @return
	 * @throws InsertPayRecordException
	 */
	public PayType record() throws InsertPayRecordException{
		//增加支付日志记录
		verify.addRecord(this);
		return this;
	}
	
	/**
	 * 获取openid
	 * @return
	 */
	public String getOpenId() {
		if(openId == null || openId.equals("")){
			this.openId = verify.getOpenId(this);
		}
		return openId;
	}

	/**
	 * 设置openid
	 * @param openId
	 */
	public void setOpenId(String openId) {
		this.openId = openId;
	}
	
	/**
	 * 获取支付类型的枚举值
	 * @return
	 */
	public Integer getValue() {
		return value;
	}

	/**
	 * 获取支付类型的描述
	 * @return
	 */
	public String getDesc() {
		return desc;
	}

	/**
	 * 获取发送请求加密后的xml
	 * @return
	 */
	public String getReqXml() {
		return reqXml;
	}

	/**
	 * 设置发送请求加密后的xml
	 * @param reqXml
	 */
	public void setReqXml(String reqXml) {
		this.reqXml = reqXml;
	}

	/**
	 * 获取请求响应的xml
	 * @return String
	 */
	public String getRspXml() {
		return rspXml;
	}

	/**
	 * 设置请求响应的xml
	 * @return
	 */
	public void setRspXml(String rspXml) {
		this.rspXml = rspXml;
	}

	/**
	 * 获取请求的url
	 * @return
	 */
	public String getUrl() {
		return url;
	}

	/**
	 * 设置请求url
	 * @param url
	 */
	public void setUrl(String url) {
		this.url = url;
	}

	/**
	 * 支付状态
	 */
	public String getPayStatus() {
		return payStatus;
	}

	/**
	 * 设置支付状态
	 * @param payStatus
	 */
	public void setPayStatus(String payStatus) {
		this.payStatus = payStatus;
	}

	/**
	 * 请求错误信息
	 * @return
	 */
	public String getError() {
		return error;
	}

	/**
	 * 设置请求错误信息
	 * @param error
	 */
	public void setError(String error) {
		this.error = error;
	}

	/**
	 * 发送请求的时间
	 * @return
	 */
	public Date getReqTime() {
		return reqTime;
	}

	/**
	 * 设置发送请求的时间
	 * @return
	 */
	public void setReqTime(Date reqTime) {
		this.reqTime = reqTime;
	}
	/**
	 * 请求响应的时间
	 * @return
	 */
	public Date getRspTime() {
		return rspTime;
	}
	/**
	 * 设置请求响应的时间
	 * @return
	 */
	public void setRspTime(Date rspTime) {
		this.rspTime = rspTime;
	}

	/**
	 * 请求响应的对象数据，map格式
	 * @return Map
	 */
	public Map getRspData() {
		return rspData;
	}

	/**
	 * 设置请求响应的对象数据，map格式
	 * @return Map
	 */
	public void setRspData(Map rspData) {
		this.rspData = rspData;
	}

	/**
	 * 获取传入的请求对象
	 * @return Map
	 */
	public Object getObj() {
		return obj;
	}

	/**
	 * 获取传入的请求参数对象map
	 * @return Map
	 */
	public Map getReqData() {
		return reqData;
	}

	/**
	 * 设置传入的请求参数对象map
	 * @return Map
	 */
	public void setReqData(Map reqData) {
		this.reqData = reqData;
	}

	/**
	 * 请求返回结果业务数据是否成功
	 * @return Map
	 */
	public boolean isSucessed() {
		return sucessed;
	}

	
	public void setSucessed(boolean sucessed) {
		this.sucessed = sucessed;
	}
}
